package com.sakura.util.minio.controller;

import com.sakura.util.R;
import com.sakura.util.minio.util.MinioUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @author : Sakura
 * @Date : 2023/8/7 13:28
 * @Description : TODO 用来接收图片下载何保存本地的请求
 */
@Api(value = "/minio/image", tags = {"minio图片上传"})
@RestController
@RequestMapping("/minio/image")
//解决跨域问题
@CrossOrigin
public class MinioImageController {

    @Autowired
    private MinioUtils minioUtils;

    /**
     * 上传文件
     * @param file: 前端上传的文件，用于保存在本地服务器的文件
     * @return R<String>
     * @author Sakura
     * @date 2023/12/6 14:07
     */
    @ApiOperation(value = "上传文件", notes = "上传文件", httpMethod = "POST")
    @PostMapping("upload")
    public R<String> uploadFromMinio(MultipartFile file) {
        if (file==null) {
            return R.error("上传失败，请不要上传空文件");
        }
        // 上传文件,如果是单文件，直接创建数组
        List<String> upload = minioUtils.upload(new MultipartFile[]{file});
        if (upload.size() > 0) {
            return R.success(upload.get(0));
        }
        return R.error("上传失败，请重新尝试");
    }


    /**
     * 前端页面请求下载图片给前端页面的回显
     *
     * @param name :     文件名称
     * @param response :
     * @return void
     * @author Sakura
     * @date 2023/8/7 13:34
     */
    @ApiOperation(value = "前端页面请求下载图片给前端页面的回显", notes = "前端页面请求下载图片给前端页面的回显", httpMethod = "GET")
    @GetMapping("/download")
    public ResponseEntity<byte[]> download( @RequestParam(required =true)String name,
                                           HttpServletResponse response) {
        ResponseEntity<byte[]> download = minioUtils.download(name);
        return download;
    }


    /**
     * @param file: 前端上传的文件，用于保存在本地服务器的文件
     * @return R<String>
     * @author Sakura
     * @date 2023/8/7 13:37
     */
//    @PostMapping("/upload")
//    public R<String> upload(MultipartFile file) {
//
//        System.out.println(file);
//        String Filename = UUID.randomUUID().toString();
//        // file是一个临时文件，需要转存到指定位置，否则本次请求完成后会被删除。
//        // 获取原来文件的名字。
//        String originalFilename = file.getOriginalFilename();
//        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
//        Filename = Filename + suffix;
//        // 判断文件夹是否存在,不存在就创建。
//        File file1 = new File(basePath);
//        if (!file1.exists()) {
//            file1.mkdirs();
//        }
//        // 把临时文件转存到新的指定位置。
//        try {
//            file.transferTo(new File(basePath + Filename));
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
////        将保存好的文件名称拼接物理地址路径，然后将完整路径返回，让前端访问download方法回显图片
//        return R.success(Filename);
//    }

    /**
     * 前端页面请求下载图片给前端页面的回显
     *
     * @param name:     文件名称
     * @param response:
     * @return void
     * @author Sakura
     * @date 2023/8/7 13:34
     */
//    @GetMapping("/download")
//    public void download(String name, HttpServletResponse response) {
//        //        System.out.println("下载"+name);
//        try {
//            //设置响应内容类型。
//            response.setContentType("image/jpeg");
//            // 创建文件输入流，读取服务器的文件。
//            FileInputStream fileInputStream = new FileInputStream(new File(basePath + name));
////            System.out.println("文件名"+name);
//            int len = 0;
//            byte[] bytes = new byte[1024];
//            // 获取文件输出流，以写数据到前端。
//            ServletOutputStream outputStream = response.getOutputStream();
//            // 循环读取
//            while ((len = fileInputStream.read(bytes)) != -1) {
//                outputStream.write(bytes, 0, len);
//                // 刷新
//                outputStream.flush();
//            }
//            // 关闭资源
//            fileInputStream.close();
//            outputStream.close();
//        } catch (FileNotFoundException e) {
//            e.printStackTrace();
//            //异常的正确处理模式应该是自定义异常，然后将抛出的异常返回给前端页面
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
}
